package com.board.controller;


import cn.hutool.core.bean.BeanUtil;
import com.board.dto.AccountDto;
import com.board.dto.AccountNewDto;
import com.board.dto.AdminInfoDto;
import com.board.entity.AdminInfo;
import com.board.form.AddAdminAccountForm;
import com.board.form.AdminLoginForm;
import com.board.form.UpdateAdminPassForm;
import com.board.param.AddAdminAccountParam;
import com.board.param.AdminLoginParam;
import com.board.service.AdminInfoService;
import com.board.util.JwtUtil;
import com.board.util.PageInfo;
import com.board.util.Result;
import io.jsonwebtoken.Jwt;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author 小叶
 * @since 2024年04月03日
 */
@RestController
@RequestMapping("/adminInfo")
@Api(tags = "后台账号信息接口")
public class AdminInfoController {
    @Autowired
    private AdminInfoService adminInfoService;
    /**
     * 根据管理员ID查询管理员信息。
     *
     * @param adminId 管理员的ID，用于查询特定管理员的信息。
     * @return 返回一个结果对象，包含管理员的信息
     */
    @GetMapping("/findAdminById")
    @ApiOperation("根据id查询管理员信息")
    public Result findAdminById(Integer adminId){
        AdminInfoDto dto= adminInfoService.findAdminById(adminId);
        return Result.success("根据id查询管理员信息成功",dto);
    }

    /**
     * 新增后台用户
     * @param form 新增的用户名和密码
     * @return 返回新增的账号信息
     */
    @PostMapping("/addAdminAccount")
    @ApiOperation("新增后台用户")
    public Result addAdminAccount(@RequestBody AddAdminAccountForm form){
        AccountNewDto dto= adminInfoService.addAdminAccount(BeanUtil.toBean(form, AddAdminAccountParam.class));
        return Result.success("新增后台用户成功",dto);
    }

    /**
     * 登录后台账号
     * @param form 登录的用户名和密码
     * @param response 响应token
     * @return 返回登录信息
     */
    @PostMapping("/adminLogin")
    @ApiOperation("登录")
    public Result adminLogin(@RequestBody AdminLoginForm form, HttpServletResponse response){
        AccountNewDto  dto =adminInfoService.adminLogin(BeanUtil.toBean(form, AdminLoginParam.class));
        //返回token信息
        HashMap<String, Object> map = new HashMap<>();
        map.put("id",dto.getAdminId());
        map.put("role",dto.getRoleName());
        String token = JwtUtil.createToken(map, 24 * 60);
        //利用响应返回token信息
        response.setHeader("token",token);
        return Result.success("登录成功",dto);
    }

    /**
     * 禁用后台账号
     * @param adminId 要禁用的账号id
     * @return 返回被禁用的账号信息
     */
    @PostMapping("/disableAdmin")
    @ApiOperation("禁用后台账号")
    public Result disableAdmin(Integer adminId,@RequestHeader String token){
        Integer loginId = (Integer) JwtUtil.getData(token, "id");
        AccountDto dto = adminInfoService.disableAdmin(adminId,loginId);
        return Result.success("禁用账号成功",dto);
    }

    /**
     * 启用后台账号
     * @param adminId 要启用的账号id
     * @return 返回启用的账号信息
     */
    @PostMapping("/enableAdmin")
    @ApiOperation("启用后台账号")
    public Result enableAdmin(Integer adminId,@RequestHeader String token){
        Integer loginId = (Integer) JwtUtil.getData(token, "id");
        AccountDto dto= adminInfoService.enableAdmin(adminId,loginId);
        return Result.success("启用账号成功",dto);
    }


//    @PostMapping("/deleteAdmin")
//    @ApiOperation("删除后台账号")
//    public Result deleteAdmin(Integer adminId,@RequestHeader String token){
//        Integer loginId = (Integer) JwtUtil.getData(token, "id");
//        adminInfoService.deleteAdmin(adminId,loginId);
//        return Result.success("删除账号成功",null);
//    }


    /**
     * 修改密码
     * @param form 旧密码和新密码
     * @param token 修改密码的token
     * @return 返回修改后的账号信息
     */
    @PostMapping("/updateAdminPass")
    @ApiOperation("修改后台账号密码")
    public Result updateAdminPass(@RequestBody UpdateAdminPassForm form,@RequestHeader String token){
        Integer loginId = (Integer) JwtUtil.getData(token, "id");
        AccountNewDto dto= adminInfoService.updateAdminPass(BeanUtil.toBean(form, UpdateAdminPassForm.class),loginId);
        return Result.success("修改密码成功",dto);
    }

    /**
     * 条件查询后台账号
     * @param adminUser 查询条件账号名
     * @param pageNum 页码
     * @param pageSize 页数
     * @return 返回查询的数据
     */
    @GetMapping("/findAllAdmin")
    @ApiOperation("查询后台账号")
    public Result findAllAdmin(String adminUser,Integer pageNum,Integer pageSize){
        PageInfo<AccountDto> dtoPageInfo= adminInfoService.findAllAdmin(adminUser,pageNum,pageSize);
        return Result.success("查询账号信息成功",dtoPageInfo);
    }

}

